package string_learn.oj;

import inherit.C;

/**
 * @author yuisama
 * @date 2022/09/21 19:28
 * 字符串转整型问题
 **/
public class Nowcoder_Str2Int {
    public int StrToInt(String str) {
        // 1.边界条件的判断
        if (str == null || str.length() == 0) {
            return 0;
        }
        // str有内容
        // 2.难点一，出现负数怎么处理？
        // str = "-1234" => -1234,引入标志位辅助变量
        // 我将str中所有的内容都看做正整数处理，最终 * flag即可
        int flag = 1;
        // str中的数字有可能会超过整数的最大值，因此我们先使用long来存储内容
        long ret = 0;
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            // 首先判断一下首个字符的情况，到底是正数还是负数的情况
            if (i == 0 && c == '+') {
                continue;
            }else if (i == 0 && c == '-') {
                flag = -1;
            }else {
                // 此时处理c是否是合法字符
                if (!Character.isDigit(c)) {
                    // 找到反例，不是数字字符串
                    return 0;
                }else {
                    // "1234" 当i == 0，拿到c = '1' => 咋样能把这个c转为1这个整数？
                    // 1最高位，拿到这个数字的时候，还要使得这个1成为1000
                    // 当i == 1,c == '2'-》2  200?
                    // 这里有一个边界条件，"1234" 长度为4,不断×str.length()-i-1
                    // (c-'0') * Math.pow(10,str.length() - i - 1);
                    // str ="-1234"
                    // 1234  1变成1000 就相当于连着×10*10*10
                    // ret = 0 => ret = 1 =>  ret = 10 + 2 = 12 => ret = 120 + 3 = 123 => ret = 1230 + 4
                    ret = ret * 10 + (c - '0');
                    // 走着走着溢出了，直接返回0
                    if (ret > Integer.MAX_VALUE) {
                        return 0;
                    }
                }
            }
        }
        ret = ret * flag;
        return (int) ret;
    }
}